5：找到其他数据库的分页方式（oracle,db2,sql server等)

1）oracle分页方式
注意 
不能对rownum使用>（大于1的数值）、>=（大于或等于1的数值）、=（大于或等于1的数值），否则无结果，所以直接用只能从1开始。
rownum>10没有记录，因为第一条不满足去掉的话，第二条rownum又成了1，所以永远没有满足条件的记录。
select * from student where rownum>=1;
如果想要rownum不从1开始，需按下面方法使用
select a.* from (select student.*,rownum rn from student) a 
where rn>5;

分页查询1：
select * from (select a1.* ,rownum rn from (select * from student)a1 where rownum<=5)
 where rn>=2;

分页查询2：
select a1.* from (select student.*,rownum rn from student where rownum<=5) a1 
where rn>=3

分页查询3：
select a1.* from(select student.*,rownum rn from student) a1 
where rn between 2 and 5;

2）db2分页方式
db2和Oracle实现分页的方式类似，所需要的参数为要查询的数据开始的条数start，结尾的条数end，并且在sql语句中还需要设定row_number()（Oracle中为rownum）作为查询的辅助函数，此时要使用select语句的嵌套，嵌套在from子句中进行。 
子句为： 
select row_number() over ( order by date desc ) as r,e.* from emp e 
其中 
row_number() 作为人为的添加一列作为给每一条数据进行编号 
over()中是实现排序的字段和方式，date是字段名，desc是方式，都可以修改，但是over()为必须写的，不写会报错 
as r是为row_number()这个列取的一个别名 
真正要分页查询的数据在外面的父句中进行实现

完整的语句为 
select * from ( 
select row_number() over(ORDER BY date DESC) as r,e.* 
from emp e 
where e.name=’A’) 
where r between 1 AND 5

此时的start为1，end为5，要注意between…and是>=1并且<=5实际上查出的是6条数据，所以要注意limit和end之间的处理
，可以在action中进行，否则可能会出现每页显示条数不正确或者每一页的最后一条数据和下一页第一条数据重复等问题

还有一种方式是用>=和<=直接实现的 
语句为 
select * from ( 
select row_number() over(ORDER BY date DESC) as r,e.* 
from emp e 
where e.name=’A’ AND r<=5) 
where r>0 
此时显示的是1-5条数据，因为数据库是从1开始的。

3）sql分页方式
三种SQL分页法 
表中主键必须为标识列，[ID] int IDENTITY (1,1) 
1.分页方案一：(利用Not In和SELECT TOP分页) 
语句形式： 
SELECT TOP 10 * 
FROM TestTable 
WHERE (ID NOT IN 
(SELECT TOP 20 id 
FROM TestTable 
ORDER BY id)) 
ORDER BY ID 


SELECT TOP 页大小 * 
FROM TestTable 
WHERE (ID NOT IN 
(SELECT TOP (页大小*(页数-1)) id 
FROM 表 
ORDER BY id)) 
ORDER BY ID 
2.分页方案二：(利用ID大于多少和SELECT TOP分页） 
语句形式： 
SELECT TOP 10 * 
FROM TestTable 
WHERE (ID >= 
(SELECT MAX(id) 
FROM (SELECT TOP 21 id 
FROM TestTable 
ORDER BY id) AS T)) 
ORDER BY ID 


SELECT TOP 页大小 * 
FROM TestTable 
WHERE (ID >= 
(SELECT MAX(id) 
FROM (SELECT TOP (页大小*(页数-1)+1) id 
FROM 表 
ORDER BY id) AS T)) 
ORDER BY ID 
3.分页方案三：(利用SQL的游标存储过程分页) 

create procedure SqlPager 
@sqlstr nvarchar(4000), --查询字符串 
@currentpage int, --第N页 
@pagesize int --每页行数 
as 
set nocount on 
declare @P1 int, --P1是游标的id 
@rowcount int 
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output 
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 
set @currentpage=(@currentpage-1)*@pagesize+1 
exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
exec sp_cursorclose @P1 
set nocount off 

其它的方案：如果没有主键，可以用临时表，也可以用方案三做，但是效率会低。 
建议优化的时候，加上主键和索引，查询效率会提高。 

 分页方案一：(利用Not In和SELECT TOP分页)   效率次之，需要拼接SQL语句
分页方案二：(利用ID大于多少和SELECT TOP分页）效率最高，需要拼接SQL语句
 分页方案三：(利用SQL的游标存储过程分页)    效率最差，但是最为通用

 4）server分页方式
 ⒈offset fetch next方式【SqlServer2012及以上版本支持】【推荐】

1 select * from T_User
2 order by id
3 offset 5 rows            /*（页数-1） * 条数 */    
4 fetch next 5 rows only    /* 条数 */
⒉row_number() over()方式【SqlServer2005以上版本支持】

1 select * from 
2 (select *,row_number() over(order by id) as orderId from T_User) as t
3 where t.orderId between 11 and 15
4 /* （页数-1）* 条数 + 1 */
5 /* 页数 * 条数 */
⒊top not in方式【适用于SqlServer2012以下版本】

1 select top 5 * from T_User
2 where id not in (select top 10 id from T_User)
3 
4 /* top 条数 */
5 /* top 条数 * 页数 */
⒋max(主键)方式【本质上还是top方式，适用于SqlServer2012以下版本】

1 select top 5 * from T_User where id>=
2 (select max(id) from (select top 6 id from T_User order by  id asc) a) 
3 order by id;
4 /*top 条数*/
5 /*top（页数-1）* 条数 + 1*/
分析：在数据量较大时

　　top not in方式：查询靠前的数据速度较快

　　ROW_NUMBER() OVER()方式：查询靠后的数据速度比上一种较快

　　offset fetch next方式：速度稳定，优于前2种，但sql版本限制2012及以上才可使用